export type SocketDecodeData = [protoId: number, ...args: any[]];
export type SocketSchemaDecodeData = [protoId: number, data?: any];

export type SocketData = string | ArrayBufferLike | Blob | ArrayBufferView;

// Socket 协议编码器
export abstract class SocketProtoCoder {
    public abstract encode(protoId: number, ...data: any[]): SocketData;
    public abstract decode(data: any): SocketDecodeData;
}

export interface IProtoDefine {
    [key: string]: number;
}

// Socket 有模式的协议编码器
export abstract class SocketSchemaProtoCoder extends SocketProtoCoder {
    // 重新定义函数签名
    public abstract encode(protoId: number, data: any): any;
    public abstract decode(data: any): SocketSchemaDecodeData;
    public abstract registerSchemas(defines: IProtoDefine): void;
}

export enum SOCKET_CLOSE_CODE {
    NORMAL = 1000,   // 正常关闭。这是一个普通的关闭代码，表示没有错误发生，连接被正常关闭。
    GOING_AWAY = 1001, // 离开。表示终端意图离开，即不再想要通信。
    PROTOCOL_ERROR = 1002, // 协议错误。表示收到了不可解析的数据，即违反了WebSocket协议。
    UNSUPPORTED_DATA = 1003, // 类型不匹配。表示服务器无法处理接收到的数据类型。
    RESERVED = 1004, // 保留。这是一个保留的关闭代码，用于未来的使用。
    NO_STATUS_RCVD = 1005, // 没有收到预期的关闭代码。这是一个特殊的代码，表示没有收到关闭代码或者第一个字节是无效的。
    ABNORMAL_CLOSE = 1006, // 异常关闭。表示连接被关闭，但没有收到关闭帧。
    INVALID_FRAME_PAYLOAD = 1007, // 数据违反了协议。表示客户端收到了违反了其预期策略的数据。
    POLICY_VIOLATION = 1008, // 数据大小超出了范围。表示客户端收到了太大的数据，无法处理。
    MESSAGE_TOO_BIG = 1009, // 扩展无法满足需求。表示客户端期望服务器支持某个扩展，但服务器无法满足。
    MANDATORY_EXT = 1010, // 服务器遇到了意外条件。表示服务器遇到了预期之外的情况，导致无法完成请求。
    INTERNAL_SERVER_ERROR = 1011, // 服务器遇到意外条件。表示服务器在尝试处理请求时遇到了意外条件。
    SERVICE_RESTART = 1012, // TLS握手失败。表示TLS握手失败，通常是因为服务器证书不可信。
    TRY_AGAIN_LATER = 1013, // 服务重启。服务是预期在未来不久会恢复。
    TLS_HANDSHAKE_FAILED = 1015, // 尝试稍后再试。服务是预期在未来不久会恢复。
}